package Arrays;

import java.util.*;

public class _532_K_diffPairsinanArray {
    public int findPairs(int[] nums, int k) {
        //bad test case,what if there are more than two 1?
        if (nums.length == 0 || k < 0) {
            return 0;
        }
        int count = 0;
        Set<Integer> sets = new HashSet<Integer>();
        Set<Integer> dulpli = new HashSet<Integer>();
        Set<Integer> used = new HashSet<Integer>();
        for (int num : nums) {
            if (sets.contains(num)) {
                dulpli.add(num);
            } else {
                sets.add(num);
            }
        }
        for (int num : nums) {
            if (k == 0) {
                if (dulpli.contains(num)) {
                    count++;
                    dulpli.remove(num);
                }
            }else{
                if (!used.contains(num)) {
                    if (sets.contains(num + k)) {
                        count++;
                    }
                    used.add(num);
                }
            }
        }
        //solution that use map
//        Map<Integer,Integer> maps = new HashMap<Integer,Integer>();
//        Arrays.sort(nums);
//        for (int num : nums) {
//            if (maps.containsKey(num)) {
//                int numCount = maps.get(num);
//                maps.put(num, numCount + 1);
//            } else {
//                maps.put(num, 1);
//            }
//        }
//        if (k != 0) {
//            if (maps.get(nums[0] + k) != null) {
//                count++;
//            }
//        } else {
//            if (maps.get(nums[0] + k) > 1) {
//                count++;
//                int numCount = maps.get(nums[0] + k);
//                maps.put(nums[0] + k, numCount - 1);
//            }
//        }
//        for (int i = 1; i < nums.length; i++) {
//            if (k != 0) {
//                if (maps.get(nums[i] + k) != null) {
//                    count++;
//                }
//            } else {
//                if (maps.get(nums[i] + k) > 1) {
//                    count++;
//                    int numCount = maps.get(nums[i] + k);
//                    maps.put(nums[i] + k, numCount - 1);
//                }
//            }
//        }
        return count;
    }
}
